package com.cskaoyan.mall.order.controller.chain;

import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import com.cskaoyan.mall.common.util.DateUtil;
import com.cskaoyan.mall.order.constant.OrderStatus;
import com.cskaoyan.mall.order.converter.OrderInfoConverter;
import com.cskaoyan.mall.order.model.OrderInfo;
import com.cskaoyan.mall.order.query.OrderInfoParam;
import com.cskaoyan.mall.order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @Author Pudding
 * @Date 2024/7/18 21:40
 * 2. 保存订单和订单明细
 */
@Component
public class SaveOrderHandler extends AbstractHandler{

    @Autowired
    OrderInfoConverter orderInfoConverter;
    @Autowired
    OrderService orderService;

    @Override
    public void handle(HandlerContext handlerContext) {

        //获取责任链上下文对象参数
        OrderInfoParam orderInfoParam = handlerContext.getOrderInfoParam();
        String userId = handlerContext.getUserId();

        //2. 保存订单以及订单详情
        //2.1 把orderInfoParam转换为OrderInfo
        OrderInfo orderInfo = orderInfoConverter.convertOrderInfoParam(orderInfoParam);

        //2.2 调用orderService保存订单以及订单详情
        //2.3.1 需要额外设定订单中的一些变量
        orderInfo.setOrderStatus(OrderStatus.UNPAID.name());  //order_status
        orderInfo.setUserId(Long.parseLong(userId));          //user_id
        //2.3.2 计算总价格
        orderInfo.sumTotalAmount();                           //调用该方法，可以给总金额赋值 total_amount + origin_total_amount
        //2.3.3 外部交易流水号，给外部系统使用，只需要唯一即可。 UUID | 雪花算法生成的id
        Snowflake snowflake = IdUtil.createSnowflake(1, 1);          // 参数：workId, dataCenterId
        orderInfo.setOutTradeNo(String.valueOf(snowflake.nextId()));                     //out_trade_no：订单交易编号（第三方支付用) 外部交易流水号，给外部系统使用
        orderInfo.setTradeBody(orderInfoParam.getOrderDetailList().get(0).getSkuName()); //trade_body：使用商品名称
        //2.3.4 订单自动超时取消的时间，这个时间需要和第4步中的订单超时自动取消的延迟级别设置的时间 统一起来
        orderInfo.setExpireTime(DateUtil.datePlusMinutes(new Date(), 1));        //expire_time
        //2.4 保存订单和订单明细
        Long orderId = orderService.saveOrderInfo(orderInfo);


        //给责任链上下文对象赋值
        handlerContext.setOrderId(orderId);

        if (nextHandler != null){
            nextHandler.handle(handlerContext);
        }
    }
}
